import { StaffService } from '../admin/staff.service';
import { User } from './../../interfaces/request.interface';

import { forwardRef, Inject } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt, Strategy } from 'passport-jwt';
import { jwtConstants } from './constants';
/**
 * 注意此时的Strategy 是从 passport-jwt 包中引入的
 */
export class JwtStrategy extends PassportStrategy(Strategy) {
    constructor(
        @Inject(forwardRef(() => StaffService))
        private readonly staffServ: StaffService
    ) {
        super({
            // jwtFromRequest:ExtractJwt.fromAuthHeaderWithScheme('MyBearer'),  //提供从请求中提取 JWT 的方法，会自动从请求头Authorization中获取bearer token进行解密认证
            jwtFromRequest: (req) => {
                return req.headers.token || req.headers.Authorization || req.headers.authorization;
            },
            ignoreExpiration: true,  // 是否忽略token过期时间
            secretOrKey: jwtConstants.secret, // 签署令牌时的密钥(注意保密)
        })
    }

    /**
     * @param payload  根据token解析后的JSON，也就是登陆时传入sign(payload) 中的payload
     *  该方法的返回值构建一个user 对象，并将其作为属性附加到请求对象上 (req.user)。
     */
    async validate(payload: User): Promise<User> {
        console.log('jwt策略', payload);
        // 可以在这里查询数据库获取更多的用户信息，并返回出去。
        if (payload.type === 'admin') {
            const roles = await this.staffServ.queryRolesById(payload.id);
            return { ...payload, roles };
        }
        return { ...payload };
    }
}

